<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script>
    /*
      json 格式字符串
        + 潜规则: 按照字符串内存储的内容对字符串进行了一系列的划分
          => 普通字符串: 'jhsagdvhjkasgvfdhj'
          => 数字字符串: '798798654651323265987'
          => html 格式字符串: '<div></div>'
          => 查询字符串: 'key=value&key2=value2'
          => json 格式字符串:
            -> 字符串内写的是对象: '{ "name": "Jack", "age": 18 }'
            -> 字符串内写的是数组: '[{ "name": "Jack", "age": 18 }, { "name": "Jack", "age": 18 }]'
            -> 要求:
              1. json 格式字符串内, key 的位置必须使用 双引号包裹
              2. json 格式字符串内, 必须是 对象或者数组(数组内是一个一个的对象) 的形式
              3. json 格式字符串内, value 的位置, 如果是 纯数字或者布尔, 不需要包裹
              4. json 格式字符串内, 不能包含 函数数据类型
              5. json 格式字符串内, 不允许最后一条数据以后还有一个 逗号(,)
              6. json 格式字符串内, 引号以外的内容, 只有 冒号, 逗号, 大括号, 中括号
            -> 书写的就是 js 内的对象数据或者数组数据
            -> js 给我们提供了 json 格式转换的方法
            -> json 格式是一种独立格式, 我们可以直接书写 .json 格式文件
    */


    // 1. js 的数据类型转换成 json 格式字符串
    // 语法: JSON.stringify(要转换的js格式数据)
    // 返回值: json 格式字符串
    // var obj = { name: 'Jack', age: 18, gender: '男' }
    // var res = JSON.stringify(obj)
    // console.log(res)

    // 2. json 格式字符串转换成 js 的数据类型
    // 语法: JSON.parse(json格式字符串)
    // 注意: 传递的参数必须是一个合法的 json 格式字符串, 否则直接报错
    // var str = '{"name":"Jack","age":18,"gender":"男"}'
    // var res = JSON.parse(str)
    // console.log(res)
    // Uncaught SyntaxError: Unexpected token a in JSON at position 0
    // 只要看到这个错误, 说明 JSON.parse(xxx) 这个方法执行了
    // xxx 不是一个 json 格式字符串内
    // 你需要找到 xxx 是哪来的


    // 3. 利用 json 格式实现深拷贝
    var obj = {
      name: 'Jack',
      age: 18,
      gender: '男',
      info: {
        height: 180,
        weight: 180,
        address: {
          city: '北京'
        }
      },
      hobby: [ '吃饭', '睡觉', [ '篮球', '足球' ] ]
    }

    // 3-1. 把 obj 直接转换成 json 格式
    var r1 = JSON.stringify(obj)
    console.log(r1)
    // 3-2. 把转换好的 json 格式字符串在转换会对象
    var res = JSON.parse(r1)
    console.log(res)
    console.log(obj)

    obj.info.address.city = '上海'
    console.log(res)
    console.log(obj)

    // var res = JSON.parse(JSON.stringify(obj)) // 简易实现深拷贝
  </script>
</body>
</html>
